/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package modelo.DAO;

import java.io.Serializable;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.logging.Level;
import java.util.logging.Logger;
import modelo.Estudiante;
import modelo.conexion.Conexion;

public class EstudianteDao implements InterfaceAspirante, Serializable {
    private  Connection con =null;
    private Statement est = null;
    private PreparedStatement pre = null;
    
    @Override
    public boolean registrar(Estudiante e) {
        boolean estado = false;
          Conexion co = new Conexion();
            con = co.conectar();
            String sql = "insert into aspirantes (codigoAspirante, nombre, primerApellido, segundoApellido, sexo, fechaNacimiento,"
                         + "numeroIdentificacionAspirante, calle, barrio, manzana, ciudad) values(incremento_id_aspirante.NextVal,'"+e.getNombre()+"',"
                    + "'"+e.getPrimerApellido()+"', '"+e.getSegundoApellido()+"', '"+e.getSexo()+"', '"+e.getFechaNacimiento()+"', '"+e.getNumeroIdentificacion()+"', "
                    + "'"+e.getCalle()+"', '"+e.getBarrio()+"', '"+e.getManzana()+"', '"+e.getCiudad()+"')";
            if(!existeEstudiante(e.getNumeroIdentificacion())) {
            try {
                    con.setAutoCommit(false);
                    pre = con.prepareStatement(sql);
            
                     pre.executeUpdate();
                           con.commit();
                           pre.close();
                           con.close();
                           estado = true;
                }catch(Exception ex){
            try {
                con.rollback();
            } catch (SQLException ex1) {
                Logger.getLogger(EstudianteDao.class.getName()).log(Level.SEVERE, null, ex1);
            }
                    estado=false;
               throw new ExceptionInInitializerError(ex.getMessage());
                }
            
            if(estado==true){
                String sqlTel = "insert into telefonoAspirante (numeroTelefono, codigoAspirante) values ('"+e.getNumeroTelefono()+"'"
                        + ",(select codigoAspirante from aspirantes where numeroIdentificacionAspirante='"+e.getNumeroIdentificacion()+"'))";
                String sqlEmail = "insert into emailAspirante (direcionEmail, codigoAspirante) values ('"+e.getCorreo()+"'"
                        + ",(select codigoAspirante from aspirantes where numeroIdentificacionAspirante='"+e.getNumeroIdentificacion()+"'))";
                String sqlEstudiante="insert into estudiantes (codigoAspirante, semestreActual) values ("
                        + "(select codigoAspirante from aspirantes where numeroIdentificacionAspirante='"+e.getNumeroIdentificacion()+"'),"
                        + "'"+e.getSemestreActual()+"')";
                
                String sqlTablaUsuarios = "insert into usuarios (identificacionUsuario, codigoUsuario, tipoUsuario)"
                        + " values('"+e.getNumeroIdentificacion()+"', '"+e.getNumeroIdentificacion()+"', 'estudiante')  ";
                
                con = co.conectar();
            try {
                pre = con.prepareStatement(sqlTel);
                pre.executeUpdate();
                pre.close();
            } catch (SQLException ex) {
                               throw new ExceptionInInitializerError( "Primero" +ex.getMessage());
            }
            try {
                pre = con.prepareStatement(sqlEmail);
                pre.executeUpdate();
                pre.close();
                con.close();
            } catch (SQLException ex) {
                     throw new ExceptionInInitializerError("Segundo " +ex.getMessage());
            }
                
           try {
               con = co.conectar();
                pre = con.prepareStatement(sqlEstudiante);
                pre.executeUpdate();
                pre.close();
                 con.close();
            } catch (SQLException ex) {
                     throw new ExceptionInInitializerError("tercero "+ex.getMessage());
            }
           
           try {
                con = co.conectar();
                pre = con.prepareStatement(sqlTablaUsuarios);
                pre.executeUpdate();
                pre.close();
                 con.close();
           }catch (SQLException ex) {
                     throw new ExceptionInInitializerError("cuarto "+ex.getMessage());
            }
                 
            }
            
            }else {}
            return estado;
    }
    

    @Override
    public Estudiante consultar(String codigo) {
        Conexion co = new Conexion();
         Estudiante es = new Estudiante();
        con = co.conectar();
        String sql = "select nombre, primerApellido, segundoApellido, sexo, to_char(fechaNacimiento, 'DD/MM/YYYY') as fechaNacimiento ,"
                                + "numeroIdentificacionAspirante, calle, barrio, manzana, ciudad"
                + " from aspirantes where codigoAspirante="+codigo+"";
        String sqlTel = "select numeroTelefono from telefonoAspirante where codigoAspirante="+codigo+"";
        String sqlEmail = "select direcionEmail from emailAspirante where codigoAspirante="+codigo+"";
        String sqlEstudiante = "select semestreActual from estudiantes where codigoAspirante="+codigo+"";
        try {
           con.setAutoCommit(false);
           est = con.createStatement();
           Statement est2 = con.createStatement();
           Statement est3 = con.createStatement();
           Statement estEstudiante = con.createStatement();
           ResultSet re =  est.executeQuery(sql);
           ResultSet re2 = est2.executeQuery(sqlTel);
           ResultSet rer = est3.executeQuery(sqlEmail);
           ResultSet reEstudiante = estEstudiante.executeQuery(sqlEstudiante);
           
           if(re.next()){
              es.setNombre(re.getString("nombre"));
              es.setPrimerApellido(re.getString("primerApellido"));
              es.setSegundoApellido(re.getString("segundoApellido"));
              es.setSexo(re.getString("sexo"));
              es.setFechaNacimiento(re.getString("fechaNacimiento"));
              es.setNumeroIdentificacion(re.getString("numeroIdentificacionAspirante"));
              es.setCalle(re.getString("calle"));
              es.setBarrio(re.getString("barrio"));
              es.setManzana(re.getString("manzana"));
              es.setCiudad(re.getString("ciudad"));
           }
           if(re2.next()){
               es.setNumeroTelefono(re2.getString("numeroTelefono"));
           }
           if(rer.next()){
               es.setCorreo(rer.getString("direcionEmail"));
           }
           if(reEstudiante.next()){
               es.setSemestreActual(reEstudiante.getString("semestreActual"));
           }
              con.commit();
        } catch (Exception ex) {
           try {
             con.rollback();
           } catch(Exception e){ }
        } finally  {
                 try {
                    est.close();
                   con.close();  
                   }catch(Exception exx){
                   }  
                   }
                return es;
           }  
    

    @Override
    public boolean modificar(Estudiante objecto) {
        boolean estado = false;
        Conexion co = new Conexion();
        con = co.conectar();
        String sql = "update aspirantes set nombre='"+objecto.getNombre()+"', primerApellido='"+objecto.getPrimerApellido()+"', "
                + "segundoApellido='"+objecto.getSegundoApellido()+"', calle='"+objecto.getCalle()+"',"
                + " barrio='"+objecto.getBarrio()+"',manzana='"+objecto.getManzana()+"', ciudad='"+objecto.getCiudad()+"' "
                + "where numeroIdentificacionAspirante='"+objecto.getNumeroIdentificacion()+"'";
        String sql2="update telefonoAspirante set numeroTelefono='"+objecto.getNumeroTelefono()+"' "
                + "where codigoAspirante=(select codigoAspirante from aspirantes where numeroIdentificacionAspirante='"+objecto.getNumeroIdentificacion()+"')";
        String sql3 ="update emailAspirante set direcionEmail='"+objecto.getCorreo()+"' where"
                + " codigoAspirante=(select codigoAspirante from aspirantes where numeroIdentificacionAspirante='"+objecto.getNumeroIdentificacion()+"')";
        try {
            pre = con.prepareStatement(sql);
          PreparedStatement pre2 = con.prepareStatement(sql2);
         PreparedStatement pre3 = con.prepareStatement(sql3);
            pre.executeUpdate();
            pre2.executeUpdate();
            pre3.executeUpdate();
            estado = true;
            pre.close();
            pre2.close();
            pre3.close();
            con.close();
        } catch (SQLException ex) {
            estado = false;
            throw new ExceptionInInitializerError(ex.getMessage());
        }
        return estado;
        }
    
    

    @Override
    public void eliminar(Estudiante objecto) {
        Conexion co = new Conexion();
        con = co.conectar();
        String sql="delete from aspirantes where numeroIdentificacionAspirante='"+objecto.getNumeroIdentificacion()+"'";
        String sql2 = "delete from telefonoAspirante where codigoAspirante=(select codigoAspirante from aspirantes where numeroIdentificacionAspirante='"+objecto.getNumeroIdentificacion()+"')";
        String sql3 = "delete from emailAspirante where codigoAspirante=(select codigoAspirante from aspirantes where numeroIdentificacionAspirante='"+objecto.getNumeroIdentificacion()+"')";
        String sqlEstudiante ="delete from estudiantes where codigoAspirante=(select codigoAspirante from aspirantes where numeroIdentificacionAspirante='"+objecto.getNumeroIdentificacion()+"')";
        
        try {
           PreparedStatement pre2 = con.prepareStatement(sql2);
           PreparedStatement pre3 = con.prepareStatement(sql3);
           PreparedStatement preEstudiante = con.prepareStatement(sqlEstudiante);
            pre = con.prepareStatement(sql);

            pre2.executeUpdate();
            pre3.executeUpdate();
            preEstudiante.executeUpdate();
            pre.executeUpdate();

            pre.close();
            pre2.close();
            pre3.close();
            preEstudiante.close();
            con.close();
        } catch (SQLException ex) {
             throw new ExceptionInInitializerError(ex.getMessage());
        }
    }
    
    public boolean verificarUsuarioPassword(String numeroIdentificacion, String codigo){
        boolean estado = false;
        String sql = "select numeroIdentificacionAspirante from aspirantes where  codigoAspirante="+codigo+" ";
        try {
            pre = con.prepareStatement(sql);
            ResultSet rs = pre.executeQuery();
            if(rs.next()){
                if(rs.getString("numeroIdentificacionAspirante").equals(numeroIdentificacion)){
                    estado=true;
                }
            }
        pre.close();
        con.close();
        } catch (SQLException ex) {
            estado = false;
           throw new ExceptionInInitializerError(ex.getMessage());
        }
        
        return estado;
        
    }
    
    public String idUsuario (String identificacion) {
        Conexion co = new Conexion ();
        String codigoUsuario = null;
        con = co.conectar();
        String sql = "select identificacionUsuario from usuarios where identificacionUsuario='"+identificacion+"'";
        try {
            pre = con.prepareStatement(sql);
            ResultSet re = pre.executeQuery();
            if(re.next()){
                codigoUsuario = re.getString("identificacionUsuario");
            }
        } catch (SQLException ex) {
           throw new ExceptionInInitializerError(ex.getMessage());
        }
        return codigoUsuario;
    }
    
    
            
     public String codigoUsuario (String identificacion, String nombreColucna, String nombreTabla, String colucnaCondicion) {
        Conexion co = new Conexion ();
        String codigoUsuario = null;
        con = co.conectar();
        String sql = "select "+nombreColucna+" from "+nombreTabla+" where "+colucnaCondicion+"='"+identificacion+"'";
        try {
            pre = con.prepareStatement(sql);
            ResultSet re = pre.executeQuery();
            if(re.next()){
                codigoUsuario = re.getString(nombreColucna);
            }
        } catch (SQLException ex) {
           throw new ExceptionInInitializerError(ex.getMessage());
        }
        return codigoUsuario;
    }        
    
    public String tipoUsuario (String identificacion){
        Conexion co = new Conexion ();
        String tipoUsuario = null;
        con = co.conectar();
        String sql = "select tipoUsuario from usuarios where identificacionUsuario='"+identificacion+"'";
        try {
            pre = con.prepareStatement(sql);
            ResultSet re = pre.executeQuery();
            if(re.next()){
                tipoUsuario = re.getString("tipoUsuario");
            }
        } catch (SQLException ex) {
           throw new ExceptionInInitializerError(ex.getMessage());
        }
        return tipoUsuario;
    }
    
    public boolean existeEstudiante (String identificacion) {
        boolean existe = false;
        Conexion co = new Conexion();
        con = co.conectar();
        String sql = "select numeroIdentificacionAspirante from aspirantes where numeroIdentificacionAspirante='"+identificacion+"'";
        try {
            pre = con.prepareStatement(sql);
            ResultSet re = pre.executeQuery();
            if(re.next()){
                if(re.getString("numeroIdentificacionAspirante").equals(identificacion)){
                    existe = true;
                }else {
                    existe = false;
                }
            }
        } catch (SQLException ex) {
           throw new ExceptionInInitializerError(ex.getMessage());
        }
        return existe;
    }
    
        
}
